#!/bin/bash

# 脚本名称：set_unused_ip.sh
# 功能：查找本地网络中未使用的IP地址，并为指定网卡设置静态IP
# 作者：资深程序员
# 日期：2025-03-22

# ============ 功能概述 ============
# 1. 自动扫描指定网段，查找未使用的IP地址。
# 2. 为指定网卡配置未使用的静态IP地址。
# 3. 自动检测并安装依赖工具（nmap）。
# 4. 输出详细的操作日志和配置结果。
# ==================================

# 显示使用方法
usage() {
    echo "用法：sudo ./set_unused_ip.sh [网卡名称] [网段]"
    echo "示例：sudo ./set_unused_ip.sh eno1 192.168.1.0/24"
    exit 1
}

# 检查是否具有sudo权限
if [ "$(id -u)" -ne 0 ]; then
    echo "请使用sudo权限运行脚本！"
    exit 1
fi

# 检查是否为 Ubuntu 系统
if ! grep -qi "ubuntu" /etc/os-release; then
    echo "错误：当前系统不是 Ubuntu，无法自动安装 nmap。"
    exit 1
fi

# 检查 nmap 是否安装，如未安装则自动安装
if ! command -v nmap &> /dev/null; then
    echo "未检测到 nmap，正在自动安装..."
    sudo apt update
    sudo apt install -y nmap
    if [ $? -ne 0 ]; then
        echo "nmap 安装失败，请手动检查。"
        exit 1
    fi
    echo "nmap 安装成功！"
fi

# 检查参数是否正确
if [ $# -ne 2 ]; then
    usage
fi

# 获取参数
INTERFACE=$1
NETWORK=$2

# 验证网卡是否存在
if ! ip link show "$INTERFACE" &>/dev/null; then
    echo "错误：网卡 '$INTERFACE' 不存在！"
    exit 1
fi

# 查找正在使用的IP地址
echo "正在扫描网络 ($NETWORK) 中已占用的IP地址，请稍等..."

# 使用 nmap 扫描已使用的IP地址
USED_IPS=$(nmap -sn "$NETWORK" | grep "Nmap scan report for" | awk '{print $NF}' | tr -d '()')

# 生成所有IP列表
ALL_IPS=$(nmap -sL "$NETWORK" | grep "Nmap scan report for" | awk '{print $NF}')

# 查找未使用的IP地址
for IP in $ALL_IPS; do
    if ! echo "$USED_IPS" | grep -q "$IP"; then
        UNUSED_IP=$IP
        break
    fi
done

# 判断是否找到可用IP
if [ -z "$UNUSED_IP" ]; then
    echo "未找到未使用的IP地址，请检查网络设置。"
    exit 1
fi

echo "找到未使用的IP地址：$UNUSED_IP"

# 设置静态IP
echo "正在为网卡 '$INTERFACE' 配置静态IP：$UNUSED_IP"
ip addr flush dev "$INTERFACE"
ip addr add "$UNUSED_IP/24" dev "$INTERFACE"
ip link set "$INTERFACE" up

# 显示配置结果
echo "配置完成，当前网卡信息："
ip addr show "$INTERFACE"
